package com.jjyou.mergedemo;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.widget.Toast;

import com.jjyou.mergesdk.JJYXCode;
import com.jjyou.mergesdk.JJYXSDK;
import com.jjyou.mergesdk.bean.InitResult;
import com.jjyou.mergesdk.bean.LogoutResult;
import com.jjyou.mergesdk.bean.PayParams;
import com.jjyou.mergesdk.bean.PayResult;
import com.jjyou.mergesdk.bean.RoleData;
import com.jjyou.mergesdk.bean.UToken;
import com.jjyou.mergesdk.bean.UserExtraData;
import com.jjyou.mergesdk.interfaces.DefaultJJYSDKListener;
import com.jjyou.mergesdk.interfaces.IRealNameCallback;
import com.jjyou.mergesdk.interfaces.IRedPacketCallback;
import com.jjyou.mergesdk.interfaces.IUserExtraCallback;
import com.jjyou.mergesdk.interfaces.IexitCallback;
import com.jjyou.mergesdk.plugin.JJYXPay;
import com.jjyou.mergesdk.plugin.JJYXUser;
import com.sdk.exampleqp.R;

import org.json.JSONObject;

import java.util.Random;
import java.util.UUID;




public class MainActivity extends Activity {

    String userId;
    String token;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);



        //注册统一回调
        JJYXSDK.getInstance().setSDKListener(new DefaultJJYSDKListener(){

            //调试接口，cp 不需要做逻辑处理， 只需要在正式打包的时候将日志去掉即可
            @Override
            public void debugMothod(String msg) {
                Log.i("MergeDemo",msg);
            }

            //初始化成功的回调， 注意：初始化成功是使用sdk的基础
            @Override
            public void onInitResult(InitResult result) {
                if ( result.getCode()==0 ){
                    tip("初始化成功");
                }else {
                    //错误码没有一个对照表， 所以建议错误的时候显示 msg 和code 出来
                    tip("初始化失败  mag="+result.getMsg()+"   code=="+result.getCode());
                }
            }

            //调用登录接口 和 切换登录接口的返回，归到同一个是因为两者操作相同
            @Override
            public void onLoginResult(UToken authResult) {
                //code 等于0说明成功，其他未错误
                try {
                    if( authResult.getCode() != 0 ){
                        //错误码没有一个对照表， 所以建议错误的时候显示 msg 和code 出来
                        throw new Exception("登录失败  mag="+authResult.getMsg()+"   code=="+authResult.getCode());
                    }

                    userId=authResult.getUserID();
                    token=authResult.getToken();
                    String extra = authResult.getExtra();//CP的专服标识 json格式
//                    String extra = "{ \"gcid\":\"10000\" }";//模拟回调返回的数据 接入测试使用 打包请注释 使用上面那一行


                    //------------多专服举例开始----------------
                    //下面为多专服举例 gcid就是专服标识 CP通过gcid获取对应的专服信息 当然不同产品专服信息的字段名称和结构可能不一样 接入时和技术确认
                    //  extra数据格式 如: { "gcid":"10000" }
                    if( !TextUtils.isEmpty(extra) ){
                        String gcid = new JSONObject( extra ).optString("gcid");
                    }
                    //------------多专服举例结束----------------

                    tip("登录成功  userId=="+userId +"   token=="+token+"   extra=="+extra);

                }catch (Exception e){
                    tip( e.toString() );
                }
            }


            //支付结果的回调，CODE_ZF_COMPLETE 是支付完成，CODE_ZF_CANCEL是支付取消 其他未支付失败。  需要注意的是支付完成不等于支付成功，所以支付是否成功必须以cp服务器为准
            @Override
            public void onPayResult(PayResult result) {
                switch (result.getCode()){
                    case JJYXCode.CODE_PAY_CANCEL:
                        tip("支付取消  orderID=="+result.getOrderID());
                        break;
                    case JJYXCode.CODE_PAY_COMPLETE:
                        tip("支付完成  orderID=="+result.getOrderID());
                        break;
                    default:
                        //失败的时候有  msg
                        //错误码没有一个对照表， 所以建议错误的时候显示 msg 和code 出来
                        tip("失败   code=="+result.getCode()+"msg=="+result.getMsg()+"    orderID=="+result.getOrderID());
                        break;
                }
            }

            //cp 调用退出登录接口 成功的回调
            @Override
            public void cpLogout(LogoutResult result) {
                //执行用户退出操作
                if (result.getCode()==0){
                    userId="";
                    token="";
                    tip("退出成功");
                }else {
                    //错误码没有一个对照表， 所以建议错误的时候显示 msg 和code 出来
                    tip("退出失败  mag="+result.getMsg()+"   code=="+result.getCode());
                }

            }



            //************************************************以下接口为 SDK主动回调CP

            //sdk 主动要求切换当前账号 并有数据返回
            @Override
            public void onSdkSwitchAccount(UToken authResult) {
                //cp 执行操作：返回到游戏登录页 -> 清理当前用户数据 -> 并用新的userId
                userId=authResult.getUserID();
                token=authResult.getToken();
                tip("SDK要求切换登录  userId=="+userId +"   token=="+token);
            }

            //sdk 主动回调退出登录的回调
            @Override
            public void sdkLogout() {
                //cp 执行操作：返回到游戏登录页 -> 清理当前用户数据 -> 调起登录;
                tip("用户点击注销，游戏需要清理数据并回调登录首页");
                userId="";
                token="";
                JJYXUser.getInstance().login();
            }

            @Override
            public void onNewMessageReminder( int unreadMsgNum ) {
                //unreadMsgNum目前没有做数量统计 CP可以判断unreadMsgNum大于0则显示未读红点 等于0不显示
                if( unreadMsgNum > 0 ){
                    //显示消息提醒
                }else {
                    //隐藏显示消息提醒
                }
                Log.e("新消息通知",unreadMsgNum+"");
            }

        });


        //初始化sdk 一定要在母包初始化完成后再调用  如果母包启动就进行动态权限申请 就需要在权限申请完成之后再调用以下代码
        JJYXSDK.getInstance().init(this);
        JJYXSDK.getInstance().onCreate(savedInstanceState);



    }


    public void onclick(View view){
        switch (view.getId()){
            case R.id.bt_login:
                //游戏调起SDK登录
                JJYXUser.getInstance().login();
                break;
            case R.id.bt_zf:
                //游戏调起SDK支付


                String dateTime=String.valueOf(System.currentTimeMillis());
                String uuid= UUID.randomUUID().toString().replaceAll("_","").toUpperCase();
                String ranEight=String.format("%08d",new Random().nextInt(99999999));
                String oderid =  dateTime+uuid+ranEight;//测试订单号 接入时请使用真实订单号


                PayParams data=new PayParams();
                data.setBuyNum(1);//购买数量 一般为1
                data.setCoinNum(100);//获得的虚拟货币数量 比如100元宝
                data.setExtension("12345678");//扩展参数,该参数会在支付成功后原样回调到cp 服务器接口
                data.setCporderID(oderid);//cp 自己的支付ID
                data.setPrice(100);//单位是分， 最少100
                data.setProductDesc("阮月弯刀是自强的刀");
                data.setProductId("8081");
                data.setProductName("阮月弯刀");
                data.setRoleId("u154251234");
                data.setRoleLevel("12");//角色等级
                data.setRoleName("死神方便");//角色名称
                data.setServerId("1");
                data.setServerName("王者服");
                data.setTime(System.currentTimeMillis());
                data.setUserID(userId);//我方返回的uid ，注意函数是：setUserID()   而不是：setSdkUserID()
                JJYXPay.getInstance().pay(data);
                break;
            case R.id.bt_switch:
                //游戏主动切换用户的按钮
                JJYXUser.getInstance().logout();
                break;
            case R.id.bt_logout:
                //游戏主动调用SDK退出用户
                JJYXUser.getInstance().logout();
                break;
            case R.id.bt_exit:
                //游戏退出按钮
                JJYXUser.getInstance().exit(new IexitCallback() {
                    @Override
                    public void onExitFinish(int ResultCode) {
                        switch (ResultCode){
                            case JJYXCode.CODE_APSDKExitResultCodeExitGame:
                                //退出游戏
                                tip("退出游戏");
                                break;
                            case JJYXCode.CODE_APSDKExitResultCodeCloseWindow:
                                //取消
                                tip("取消");
                                break;
                            case JJYXCode.CODE_APSDKExitResultCodeError:
                                //调取对话框失败
                                //*****注意： 当退出对话框拉起失败的时候 游戏一定要显示自定的退出对话框，  很重要！！！！！！
                                tip("显示自己的对话框");
                                break;
                        }
                    }
                });
                break;
            case R.id.bt_submit:

                //此接口需要在游戏登录，以及角色信息发生变化时调用
                UserExtraData userExtraData=new UserExtraData();
                userExtraData.setServerID("1");
                userExtraData.setServerName("王者服");
                userExtraData.setRoleName("死神方便");


//              public static final int TYPE_SELECT_SERVER = 1;			    //选择服务器
//              public static final int TYPE_CREATE_ROLE = 2;			    //创建角色
//              public static final int TYPE_ENTER_GAME = 3;			    //进入游戏
//              public static final int TYPE_LEVEL_UP = 4;				    //等级提升
//              public static final int TYPE_EXIT_GAME = 5;				    //退出游戏
//              public static final int TYPE_VIP_UP = 6;				    //完成新手引导 (新增)
//              public static final int TYPE_JOIN_PARTY = 7;			    //VIP等级提升 (新增)
//              public static final int TYPE_MARRY = 8;				        //加入公会 (新增)
//              public static final int TYPE_COMPLETE_BEGINNER_GUIDANCE = 9;//结婚 (新增)
                //数据同步的类型，有些sdk 需要区分数据的类型
                userExtraData.setDataType(UserExtraData.TYPE_ENTER_GAME);//默认
                userExtraData.setMoneyNum(800);//用户金币余额
                userExtraData.setRoleID(userId);//角色id 可能与sdk的UserId不一样
                userExtraData.setUserId(userId);//我方返回的uid.   注意函数是setUserId   而不是setSdkUserId
                userExtraData.setRoleLevel("12");//角色等级
                userExtraData.setVipLevel("0");//VIP等级 (新增)
                userExtraData.setRoleCreatetimer(System.currentTimeMillis());//角色创建时间


                JJYXUser.getInstance().submitExtraData(userExtraData, new IUserExtraCallback() {
                    @Override
                    public void onUserExtraCallback(int ResultCode) {
                        switch (ResultCode){
                            case JJYXCode.GAME_ROLE_SUCCESS:
                                tip("同步数据成功");
                                break;
                            case JJYXCode.GAME_ROLE_FAIL:
                                tip("同步数据失败");
                                break;
                        }
                    }
                });
                break;


        }
    }



    private void tip(String msg){
        Toast.makeText(JJYXSDK.getInstance().getContext(), msg, Toast.LENGTH_SHORT).show();
    }




    //退出 关闭游戏应用
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if ((keyCode == KeyEvent.KEYCODE_BACK)) {

            JJYXUser.getInstance().exit(new IexitCallback() {
                @Override
                public void onExitFinish(int ResultCode) {
                    switch (ResultCode){
                        case JJYXCode.CODE_APSDKExitResultCodeExitGame:
                            //退出游戏
                            tip("退出游戏");
                            break;
                        case JJYXCode.CODE_APSDKExitResultCodeCloseWindow:
                            //取消
                            tip("取消");
                            break;
                        case JJYXCode.CODE_APSDKExitResultCodeError:
                            //调取对话框失败
                            //*****注意： 当退出对话框拉起失败的时候 游戏一定要显示自定的退出对话框，  很重要！！！！！！
                            tip("显示自己的对话框");
                            break;
                    }
                }
            });
            return false;
        }else {
            return super.onKeyDown(keyCode, event);
        }
    }

    //生命周期
    @Override
    protected void onStart() {
        super.onStart();
        JJYXSDK.getInstance().onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
        JJYXSDK.getInstance().onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        JJYXSDK.getInstance().onResume();
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        JJYXSDK.getInstance().onRestart();
    }

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        JJYXSDK.getInstance().onNewIntent(intent);
    }

    @Override
    protected void onStop() {
        super.onStop();
        JJYXSDK.getInstance().onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        JJYXSDK.getInstance().onDestroy();
    }

    @Override
    public void onBackPressed() {
//        super.onBackPressed();
        JJYXSDK.getInstance().onBackPressed();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        JJYXSDK.getInstance().onActivityResult(requestCode, resultCode, data);
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        JJYXSDK.getInstance().onRequestPermissionsResult(requestCode, permissions, grantResults);
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(newBase);
        JJYXSDK.getInstance().attachBaseContext(newBase);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        JJYXSDK.getInstance().onConfigurationChanged(newConfig);
    }




}
